@scell/sdk 1.2.0 → 1.4.0
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/README.md +61 -2
- package/dist/index.d.mts +2318 -235
- package/dist/index.d.ts +2318 -235
- package/dist/index.js +1261 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1261 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +3 -1
- package/src/index.ts +17 -1
- package/src/resources/billing.ts +49 -0
- package/src/resources/fiscal.ts +128 -0
- package/src/resources/stats.ts +29 -0
- package/src/resources/sub-tenants.ts +41 -0
- package/src/resources/tenant-credit-notes.ts +301 -0
- package/src/resources/tenant-direct-credit-notes.ts +360 -0
- package/src/resources/tenant-direct-invoices.ts +424 -0
- package/src/resources/tenant-incoming-invoices.ts +429 -0
- package/src/tenant-client.ts +105 -0
- package/src/types/billing.ts +73 -0
- package/src/types/fiscal.ts +251 -0
- package/src/types/index.ts +103 -0
- package/src/types/stats.ts +37 -0
- package/src/types/sub-tenants.ts +57 -0
- package/src/types/tenant-credit-notes.ts +128 -0
- package/src/types/tenant-invoices.ts +390 -0
- package/src/types/tenant-profile.ts +51 -0
package/dist/index.js
CHANGED
|
@@ -277,6 +277,8 @@ var HttpClient = class {
|
|
|
277
277
|
};
|
|
278
278
|
if (this.authMode === "bearer") {
|
|
279
279
|
headers["Authorization"] = `Bearer ${this.authToken}`;
|
|
280
|
+
} else if (this.authMode === "tenant-key") {
|
|
281
|
+
headers["X-Tenant-Key"] = this.authToken;
|
|
280
282
|
} else {
|
|
281
283
|
headers["X-API-Key"] = this.authToken;
|
|
282
284
|
}
|
|
@@ -459,6 +461,1261 @@ var HttpClient = class {
|
|
|
459
461
|
}
|
|
460
462
|
};
|
|
461
463
|
|
|
464
|
+
// src/resources/tenant-direct-invoices.ts
|
|
465
|
+
var TenantDirectInvoicesResource = class {
|
|
466
|
+
constructor(http) {
|
|
467
|
+
this.http = http;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Create a new direct invoice
|
|
471
|
+
*
|
|
472
|
+
* Creates an outgoing invoice from the tenant to an external buyer.
|
|
473
|
+
* The invoice will be generated in the specified format (Factur-X by default).
|
|
474
|
+
*
|
|
475
|
+
* @param params - Invoice creation parameters
|
|
476
|
+
* @param requestOptions - Optional request configuration
|
|
477
|
+
* @returns Created invoice
|
|
478
|
+
*
|
|
479
|
+
* @example
|
|
480
|
+
* ```typescript
|
|
481
|
+
* const { data: invoice } = await client.directInvoices.create({
|
|
482
|
+
* company_id: 'company-uuid',
|
|
483
|
+
* buyer: {
|
|
484
|
+
* company_name: 'Acme Corporation',
|
|
485
|
+
* siret: '98765432109876',
|
|
486
|
+
* address: {
|
|
487
|
+
* line1: '456 Avenue Business',
|
|
488
|
+
* postal_code: '69001',
|
|
489
|
+
* city: 'Lyon',
|
|
490
|
+
* country: 'FR'
|
|
491
|
+
* },
|
|
492
|
+
* email: 'accounts@acme.com'
|
|
493
|
+
* },
|
|
494
|
+
* lines: [{
|
|
495
|
+
* description: 'Monthly subscription',
|
|
496
|
+
* quantity: 1,
|
|
497
|
+
* unit_price: 299,
|
|
498
|
+
* tax_rate: 20,
|
|
499
|
+
* total_ht: 299,
|
|
500
|
+
* total_tax: 59.80,
|
|
501
|
+
* total_ttc: 358.80
|
|
502
|
+
* }],
|
|
503
|
+
* issue_date: '2026-01-26',
|
|
504
|
+
* due_date: '2026-02-26',
|
|
505
|
+
* notes: 'Thank you for your business!'
|
|
506
|
+
* });
|
|
507
|
+
*
|
|
508
|
+
* console.log('Invoice created:', invoice.invoice_number);
|
|
509
|
+
* ```
|
|
510
|
+
*/
|
|
511
|
+
async create(params, requestOptions) {
|
|
512
|
+
return this.http.post(
|
|
513
|
+
"/tenant/invoices",
|
|
514
|
+
params,
|
|
515
|
+
requestOptions
|
|
516
|
+
);
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* List all direct invoices
|
|
520
|
+
*
|
|
521
|
+
* Returns a paginated list of direct invoices created by the tenant.
|
|
522
|
+
* Supports filtering by status, date range, buyer, and amount.
|
|
523
|
+
*
|
|
524
|
+
* @param filters - Filter and pagination options
|
|
525
|
+
* @param requestOptions - Optional request configuration
|
|
526
|
+
* @returns Paginated list of invoices
|
|
527
|
+
*
|
|
528
|
+
* @example
|
|
529
|
+
* ```typescript
|
|
530
|
+
* // List all validated invoices
|
|
531
|
+
* const { data: invoices, meta } = await client.directInvoices.list({
|
|
532
|
+
* status: 'validated',
|
|
533
|
+
* per_page: 50
|
|
534
|
+
* });
|
|
535
|
+
*
|
|
536
|
+
* console.log(`Found ${meta.total} validated invoices`);
|
|
537
|
+
*
|
|
538
|
+
* // Filter by date range
|
|
539
|
+
* const januaryInvoices = await client.directInvoices.list({
|
|
540
|
+
* date_from: '2026-01-01',
|
|
541
|
+
* date_to: '2026-01-31'
|
|
542
|
+
* });
|
|
543
|
+
*
|
|
544
|
+
* // Search by buyer
|
|
545
|
+
* const acmeInvoices = await client.directInvoices.list({
|
|
546
|
+
* search: 'Acme'
|
|
547
|
+
* });
|
|
548
|
+
* ```
|
|
549
|
+
*/
|
|
550
|
+
async list(filters = {}, requestOptions) {
|
|
551
|
+
const query = {
|
|
552
|
+
...filters,
|
|
553
|
+
status: Array.isArray(filters.status) ? filters.status.join(",") : filters.status
|
|
554
|
+
};
|
|
555
|
+
return this.http.get(
|
|
556
|
+
"/tenant/invoices",
|
|
557
|
+
query,
|
|
558
|
+
requestOptions
|
|
559
|
+
);
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Get a specific direct invoice by ID
|
|
563
|
+
*
|
|
564
|
+
* @param invoiceId - Invoice UUID
|
|
565
|
+
* @param requestOptions - Optional request configuration
|
|
566
|
+
* @returns Invoice details
|
|
567
|
+
*
|
|
568
|
+
* @example
|
|
569
|
+
* ```typescript
|
|
570
|
+
* const { data: invoice } = await client.directInvoices.get('invoice-uuid');
|
|
571
|
+
*
|
|
572
|
+
* console.log('Invoice:', invoice.invoice_number);
|
|
573
|
+
* console.log('Status:', invoice.status);
|
|
574
|
+
* console.log('Total:', invoice.total_ttc, invoice.currency);
|
|
575
|
+
* ```
|
|
576
|
+
*/
|
|
577
|
+
async get(invoiceId, requestOptions) {
|
|
578
|
+
return this.http.get(
|
|
579
|
+
`/tenant/invoices/${invoiceId}`,
|
|
580
|
+
void 0,
|
|
581
|
+
requestOptions
|
|
582
|
+
);
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Update a direct invoice
|
|
586
|
+
*
|
|
587
|
+
* Only invoices in 'draft' status can be updated.
|
|
588
|
+
* Once validated or sent, invoices become immutable.
|
|
589
|
+
*
|
|
590
|
+
* @param invoiceId - Invoice UUID
|
|
591
|
+
* @param params - Update parameters
|
|
592
|
+
* @param requestOptions - Optional request configuration
|
|
593
|
+
* @returns Updated invoice
|
|
594
|
+
*
|
|
595
|
+
* @example
|
|
596
|
+
* ```typescript
|
|
597
|
+
* const { data: invoice } = await client.directInvoices.update(
|
|
598
|
+
* 'invoice-uuid',
|
|
599
|
+
* {
|
|
600
|
+
* due_date: '2026-03-15',
|
|
601
|
+
* notes: 'Updated payment terms'
|
|
602
|
+
* }
|
|
603
|
+
* );
|
|
604
|
+
*
|
|
605
|
+
* console.log('Invoice updated:', invoice.due_date);
|
|
606
|
+
* ```
|
|
607
|
+
*/
|
|
608
|
+
async update(invoiceId, params, requestOptions) {
|
|
609
|
+
return this.http.patch(
|
|
610
|
+
`/tenant/invoices/${invoiceId}`,
|
|
611
|
+
params,
|
|
612
|
+
requestOptions
|
|
613
|
+
);
|
|
614
|
+
}
|
|
615
|
+
/**
|
|
616
|
+
* Delete a direct invoice
|
|
617
|
+
*
|
|
618
|
+
* Only invoices in 'draft' status can be deleted.
|
|
619
|
+
* Validated or sent invoices cannot be deleted for audit trail compliance.
|
|
620
|
+
*
|
|
621
|
+
* @param invoiceId - Invoice UUID
|
|
622
|
+
* @param requestOptions - Optional request configuration
|
|
623
|
+
*
|
|
624
|
+
* @example
|
|
625
|
+
* ```typescript
|
|
626
|
+
* await client.directInvoices.delete('draft-invoice-uuid');
|
|
627
|
+
* console.log('Invoice deleted successfully');
|
|
628
|
+
* ```
|
|
629
|
+
*/
|
|
630
|
+
async delete(invoiceId, requestOptions) {
|
|
631
|
+
return this.http.delete(
|
|
632
|
+
`/tenant/invoices/${invoiceId}`,
|
|
633
|
+
requestOptions
|
|
634
|
+
);
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* Validate a direct invoice
|
|
638
|
+
*
|
|
639
|
+
* Validates the invoice, generates the electronic invoice file,
|
|
640
|
+
* and changes status from 'draft' to 'validated'.
|
|
641
|
+
*
|
|
642
|
+
* @param invoiceId - Invoice UUID
|
|
643
|
+
* @param requestOptions - Optional request configuration
|
|
644
|
+
* @returns Validated invoice
|
|
645
|
+
*
|
|
646
|
+
* @example
|
|
647
|
+
* ```typescript
|
|
648
|
+
* const { data: invoice } = await client.directInvoices.validate('invoice-uuid');
|
|
649
|
+
* console.log('Invoice validated:', invoice.status); // 'validated'
|
|
650
|
+
* console.log('Validated at:', invoice.validated_at);
|
|
651
|
+
* ```
|
|
652
|
+
*/
|
|
653
|
+
async validate(invoiceId, requestOptions) {
|
|
654
|
+
return this.http.post(
|
|
655
|
+
`/tenant/invoices/${invoiceId}/validate`,
|
|
656
|
+
void 0,
|
|
657
|
+
requestOptions
|
|
658
|
+
);
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* Send a direct invoice to the buyer
|
|
662
|
+
*
|
|
663
|
+
* Sends the validated invoice to the buyer via email.
|
|
664
|
+
* The invoice must be in 'validated' status.
|
|
665
|
+
*
|
|
666
|
+
* @param invoiceId - Invoice UUID
|
|
667
|
+
* @param requestOptions - Optional request configuration
|
|
668
|
+
* @returns Updated invoice
|
|
669
|
+
*
|
|
670
|
+
* @example
|
|
671
|
+
* ```typescript
|
|
672
|
+
* const { data: invoice } = await client.directInvoices.send('invoice-uuid');
|
|
673
|
+
* console.log('Invoice sent to:', invoice.buyer.email);
|
|
674
|
+
* ```
|
|
675
|
+
*/
|
|
676
|
+
async send(invoiceId, requestOptions) {
|
|
677
|
+
return this.http.post(
|
|
678
|
+
`/tenant/invoices/${invoiceId}/send`,
|
|
679
|
+
void 0,
|
|
680
|
+
requestOptions
|
|
681
|
+
);
|
|
682
|
+
}
|
|
683
|
+
/**
|
|
684
|
+
* Download invoice as PDF
|
|
685
|
+
*
|
|
686
|
+
* Downloads the electronic invoice file as a PDF (Factur-X).
|
|
687
|
+
*
|
|
688
|
+
* @param invoiceId - Invoice UUID
|
|
689
|
+
* @param requestOptions - Optional request configuration
|
|
690
|
+
* @returns ArrayBuffer containing the PDF file
|
|
691
|
+
*
|
|
692
|
+
* @example
|
|
693
|
+
* ```typescript
|
|
694
|
+
* // Download invoice PDF
|
|
695
|
+
* const pdfBuffer = await client.directInvoices.download('invoice-uuid');
|
|
696
|
+
*
|
|
697
|
+
* // In Node.js, save to file:
|
|
698
|
+
* import { writeFileSync } from 'fs';
|
|
699
|
+
* writeFileSync('invoice.pdf', Buffer.from(pdfBuffer));
|
|
700
|
+
*
|
|
701
|
+
* // In browser, trigger download:
|
|
702
|
+
* const blob = new Blob([pdfBuffer], { type: 'application/pdf' });
|
|
703
|
+
* const url = URL.createObjectURL(blob);
|
|
704
|
+
* const a = document.createElement('a');
|
|
705
|
+
* a.href = url;
|
|
706
|
+
* a.download = 'invoice.pdf';
|
|
707
|
+
* a.click();
|
|
708
|
+
* ```
|
|
709
|
+
*/
|
|
710
|
+
async download(invoiceId, requestOptions) {
|
|
711
|
+
return this.http.getRaw(
|
|
712
|
+
`/tenant/invoices/${invoiceId}/download`,
|
|
713
|
+
void 0,
|
|
714
|
+
requestOptions
|
|
715
|
+
);
|
|
716
|
+
}
|
|
717
|
+
/**
|
|
718
|
+
* Download invoice XML
|
|
719
|
+
*
|
|
720
|
+
* Downloads the electronic invoice XML (UBL/CII format).
|
|
721
|
+
*
|
|
722
|
+
* @param invoiceId - Invoice UUID
|
|
723
|
+
* @param requestOptions - Optional request configuration
|
|
724
|
+
* @returns ArrayBuffer containing the XML file
|
|
725
|
+
*
|
|
726
|
+
* @example
|
|
727
|
+
* ```typescript
|
|
728
|
+
* const xmlBuffer = await client.directInvoices.downloadXml('invoice-uuid');
|
|
729
|
+
* const xmlString = new TextDecoder().decode(xmlBuffer);
|
|
730
|
+
* console.log('XML:', xmlString);
|
|
731
|
+
* ```
|
|
732
|
+
*/
|
|
733
|
+
async downloadXml(invoiceId, requestOptions) {
|
|
734
|
+
return this.http.getRaw(
|
|
735
|
+
`/tenant/invoices/${invoiceId}/download`,
|
|
736
|
+
{ format: "xml" },
|
|
737
|
+
requestOptions
|
|
738
|
+
);
|
|
739
|
+
}
|
|
740
|
+
/**
|
|
741
|
+
* Bulk create multiple invoices
|
|
742
|
+
*/
|
|
743
|
+
async bulkCreate(invoices, requestOptions) {
|
|
744
|
+
return this.http.post(
|
|
745
|
+
"/tenant/invoices/bulk",
|
|
746
|
+
{ invoices },
|
|
747
|
+
requestOptions
|
|
748
|
+
);
|
|
749
|
+
}
|
|
750
|
+
/**
|
|
751
|
+
* Bulk submit multiple invoices
|
|
752
|
+
*/
|
|
753
|
+
async bulkSubmit(invoiceIds, requestOptions) {
|
|
754
|
+
return this.http.post(
|
|
755
|
+
"/tenant/invoices/bulk-submit",
|
|
756
|
+
{ invoice_ids: invoiceIds },
|
|
757
|
+
requestOptions
|
|
758
|
+
);
|
|
759
|
+
}
|
|
760
|
+
/**
|
|
761
|
+
* Get status of multiple invoices
|
|
762
|
+
*/
|
|
763
|
+
async bulkStatus(invoiceIds, requestOptions) {
|
|
764
|
+
return this.http.post(
|
|
765
|
+
"/tenant/invoices/bulk-status",
|
|
766
|
+
{ invoice_ids: invoiceIds },
|
|
767
|
+
requestOptions
|
|
768
|
+
);
|
|
769
|
+
}
|
|
770
|
+
};
|
|
771
|
+
|
|
772
|
+
// src/resources/tenant-direct-credit-notes.ts
|
|
773
|
+
var TenantDirectCreditNotesResource = class {
|
|
774
|
+
constructor(http) {
|
|
775
|
+
this.http = http;
|
|
776
|
+
}
|
|
777
|
+
/**
|
|
778
|
+
* Create a new credit note for a direct invoice
|
|
779
|
+
*
|
|
780
|
+
* Creates a credit note (avoir) linked to a direct invoice.
|
|
781
|
+
* - For partial credit notes, specify the items and quantities to credit.
|
|
782
|
+
* - For total credit notes, all items are automatically credited.
|
|
783
|
+
*
|
|
784
|
+
* @param params - Credit note creation parameters
|
|
785
|
+
* @param requestOptions - Optional request configuration
|
|
786
|
+
* @returns Created credit note
|
|
787
|
+
*
|
|
788
|
+
* @example
|
|
789
|
+
* ```typescript
|
|
790
|
+
* // Partial credit note
|
|
791
|
+
* const { data: creditNote } = await client.directCreditNotes.create({
|
|
792
|
+
* invoice_id: 'invoice-uuid',
|
|
793
|
+
* reason: 'Returned items',
|
|
794
|
+
* type: 'partial',
|
|
795
|
+
* items: [
|
|
796
|
+
* { invoice_line_id: 'line-1-uuid', quantity: 2 },
|
|
797
|
+
* { invoice_line_id: 'line-2-uuid', quantity: 1 }
|
|
798
|
+
* ]
|
|
799
|
+
* });
|
|
800
|
+
*
|
|
801
|
+
* // Total credit note (cancels entire invoice)
|
|
802
|
+
* const { data: totalCreditNote } = await client.directCreditNotes.create({
|
|
803
|
+
* invoice_id: 'invoice-uuid',
|
|
804
|
+
* reason: 'Invoice issued in error',
|
|
805
|
+
* type: 'total'
|
|
806
|
+
* });
|
|
807
|
+
*
|
|
808
|
+
* console.log('Credit note number:', creditNote.credit_note_number);
|
|
809
|
+
* console.log('Amount:', creditNote.total, creditNote.currency);
|
|
810
|
+
* ```
|
|
811
|
+
*/
|
|
812
|
+
async create(params, requestOptions) {
|
|
813
|
+
return this.http.post(
|
|
814
|
+
"/tenant/credit-notes",
|
|
815
|
+
params,
|
|
816
|
+
requestOptions
|
|
817
|
+
);
|
|
818
|
+
}
|
|
819
|
+
/**
|
|
820
|
+
* List all direct credit notes
|
|
821
|
+
*
|
|
822
|
+
* Returns a paginated list of credit notes for direct invoices.
|
|
823
|
+
*
|
|
824
|
+
* @param filters - Filter and pagination options
|
|
825
|
+
* @param requestOptions - Optional request configuration
|
|
826
|
+
* @returns Paginated list of credit notes
|
|
827
|
+
*
|
|
828
|
+
* @example
|
|
829
|
+
* ```typescript
|
|
830
|
+
* // List all sent credit notes
|
|
831
|
+
* const { data: creditNotes, meta } = await client.directCreditNotes.list({
|
|
832
|
+
* status: 'sent',
|
|
833
|
+
* per_page: 50
|
|
834
|
+
* });
|
|
835
|
+
*
|
|
836
|
+
* console.log(`Found ${meta.total} sent credit notes`);
|
|
837
|
+
*
|
|
838
|
+
* // Filter by date range
|
|
839
|
+
* const januaryCreditNotes = await client.directCreditNotes.list({
|
|
840
|
+
* date_from: '2026-01-01',
|
|
841
|
+
* date_to: '2026-01-31'
|
|
842
|
+
* });
|
|
843
|
+
* ```
|
|
844
|
+
*/
|
|
845
|
+
async list(filters = {}, requestOptions) {
|
|
846
|
+
return this.http.get(
|
|
847
|
+
"/tenant/credit-notes",
|
|
848
|
+
filters,
|
|
849
|
+
requestOptions
|
|
850
|
+
);
|
|
851
|
+
}
|
|
852
|
+
/**
|
|
853
|
+
* Get a specific credit note by ID
|
|
854
|
+
*
|
|
855
|
+
* @param creditNoteId - Credit note UUID
|
|
856
|
+
* @param requestOptions - Optional request configuration
|
|
857
|
+
* @returns Credit note details
|
|
858
|
+
*
|
|
859
|
+
* @example
|
|
860
|
+
* ```typescript
|
|
861
|
+
* const { data: creditNote } = await client.directCreditNotes.get('credit-note-uuid');
|
|
862
|
+
*
|
|
863
|
+
* console.log('Credit note:', creditNote.credit_note_number);
|
|
864
|
+
* console.log('Status:', creditNote.status);
|
|
865
|
+
* console.log('Reason:', creditNote.reason);
|
|
866
|
+
* console.log('Total:', creditNote.total, creditNote.currency);
|
|
867
|
+
* ```
|
|
868
|
+
*/
|
|
869
|
+
async get(creditNoteId, requestOptions) {
|
|
870
|
+
return this.http.get(
|
|
871
|
+
`/tenant/credit-notes/${creditNoteId}`,
|
|
872
|
+
void 0,
|
|
873
|
+
requestOptions
|
|
874
|
+
);
|
|
875
|
+
}
|
|
876
|
+
/**
|
|
877
|
+
* Update a credit note
|
|
878
|
+
*
|
|
879
|
+
* Only credit notes in 'draft' status can be updated.
|
|
880
|
+
*
|
|
881
|
+
* @param creditNoteId - Credit note UUID
|
|
882
|
+
* @param params - Update parameters
|
|
883
|
+
* @param requestOptions - Optional request configuration
|
|
884
|
+
* @returns Updated credit note
|
|
885
|
+
*
|
|
886
|
+
* @example
|
|
887
|
+
* ```typescript
|
|
888
|
+
* const { data: creditNote } = await client.directCreditNotes.update(
|
|
889
|
+
* 'credit-note-uuid',
|
|
890
|
+
* {
|
|
891
|
+
* reason: 'Updated reason: Customer complaint resolved',
|
|
892
|
+
* items: [
|
|
893
|
+
* { invoice_line_id: 'line-uuid', quantity: 3 }
|
|
894
|
+
* ]
|
|
895
|
+
* }
|
|
896
|
+
* );
|
|
897
|
+
* ```
|
|
898
|
+
*/
|
|
899
|
+
async update(creditNoteId, params, requestOptions) {
|
|
900
|
+
return this.http.patch(
|
|
901
|
+
`/tenant/credit-notes/${creditNoteId}`,
|
|
902
|
+
params,
|
|
903
|
+
requestOptions
|
|
904
|
+
);
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* Delete a credit note
|
|
908
|
+
*
|
|
909
|
+
* Only credit notes in 'draft' status can be deleted.
|
|
910
|
+
*
|
|
911
|
+
* @param creditNoteId - Credit note UUID
|
|
912
|
+
* @param requestOptions - Optional request configuration
|
|
913
|
+
*
|
|
914
|
+
* @example
|
|
915
|
+
* ```typescript
|
|
916
|
+
* await client.directCreditNotes.delete('draft-credit-note-uuid');
|
|
917
|
+
* console.log('Credit note deleted');
|
|
918
|
+
* ```
|
|
919
|
+
*/
|
|
920
|
+
async delete(creditNoteId, requestOptions) {
|
|
921
|
+
return this.http.delete(
|
|
922
|
+
`/tenant/credit-notes/${creditNoteId}`,
|
|
923
|
+
requestOptions
|
|
924
|
+
);
|
|
925
|
+
}
|
|
926
|
+
/**
|
|
927
|
+
* Send a credit note
|
|
928
|
+
*
|
|
929
|
+
* Validates and sends the credit note, changing status from 'draft' to 'sent'.
|
|
930
|
+
*
|
|
931
|
+
* @param creditNoteId - Credit note UUID
|
|
932
|
+
* @param requestOptions - Optional request configuration
|
|
933
|
+
* @returns Sent credit note
|
|
934
|
+
*
|
|
935
|
+
* @example
|
|
936
|
+
* ```typescript
|
|
937
|
+
* const { data: creditNote } = await client.directCreditNotes.send('credit-note-uuid');
|
|
938
|
+
* console.log('Credit note sent:', creditNote.status); // 'sent'
|
|
939
|
+
* ```
|
|
940
|
+
*/
|
|
941
|
+
async send(creditNoteId, requestOptions) {
|
|
942
|
+
return this.http.post(
|
|
943
|
+
`/tenant/credit-notes/${creditNoteId}/send`,
|
|
944
|
+
void 0,
|
|
945
|
+
requestOptions
|
|
946
|
+
);
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* Download credit note as PDF
|
|
950
|
+
*
|
|
951
|
+
* @param creditNoteId - Credit note UUID
|
|
952
|
+
* @param requestOptions - Optional request configuration
|
|
953
|
+
* @returns ArrayBuffer containing the PDF file
|
|
954
|
+
*
|
|
955
|
+
* @example
|
|
956
|
+
* ```typescript
|
|
957
|
+
* const pdfBuffer = await client.directCreditNotes.download('credit-note-uuid');
|
|
958
|
+
*
|
|
959
|
+
* // In Node.js:
|
|
960
|
+
* import { writeFileSync } from 'fs';
|
|
961
|
+
* writeFileSync('credit-note.pdf', Buffer.from(pdfBuffer));
|
|
962
|
+
*
|
|
963
|
+
* // In browser:
|
|
964
|
+
* const blob = new Blob([pdfBuffer], { type: 'application/pdf' });
|
|
965
|
+
* const url = URL.createObjectURL(blob);
|
|
966
|
+
* window.open(url);
|
|
967
|
+
* ```
|
|
968
|
+
*/
|
|
969
|
+
async download(creditNoteId, requestOptions) {
|
|
970
|
+
return this.http.getRaw(
|
|
971
|
+
`/tenant/credit-notes/${creditNoteId}/download`,
|
|
972
|
+
void 0,
|
|
973
|
+
requestOptions
|
|
974
|
+
);
|
|
975
|
+
}
|
|
976
|
+
/**
|
|
977
|
+
* Get remaining creditable amount for a direct invoice
|
|
978
|
+
*
|
|
979
|
+
* Returns information about how much can still be credited,
|
|
980
|
+
* including line-by-line breakdown.
|
|
981
|
+
*
|
|
982
|
+
* @param invoiceId - Invoice UUID
|
|
983
|
+
* @param requestOptions - Optional request configuration
|
|
984
|
+
* @returns Remaining creditable information
|
|
985
|
+
*
|
|
986
|
+
* @example
|
|
987
|
+
* ```typescript
|
|
988
|
+
* const remaining = await client.directCreditNotes.remainingCreditable('invoice-uuid');
|
|
989
|
+
*
|
|
990
|
+
* console.log('Invoice total:', remaining.invoice_total);
|
|
991
|
+
* console.log('Already credited:', remaining.credited_total);
|
|
992
|
+
* console.log('Can still credit:', remaining.remaining_total);
|
|
993
|
+
*
|
|
994
|
+
* // Check per-line
|
|
995
|
+
* remaining.lines.forEach(line => {
|
|
996
|
+
* if (line.remaining_quantity > 0) {
|
|
997
|
+
* console.log(`${line.description}: ${line.remaining_quantity} units remaining`);
|
|
998
|
+
* }
|
|
999
|
+
* });
|
|
1000
|
+
* ```
|
|
1001
|
+
*/
|
|
1002
|
+
async remainingCreditable(invoiceId, requestOptions) {
|
|
1003
|
+
return this.http.get(
|
|
1004
|
+
`/tenant/invoices/${invoiceId}/remaining-creditable`,
|
|
1005
|
+
void 0,
|
|
1006
|
+
requestOptions
|
|
1007
|
+
);
|
|
1008
|
+
}
|
|
1009
|
+
};
|
|
1010
|
+
|
|
1011
|
+
// src/resources/tenant-incoming-invoices.ts
|
|
1012
|
+
var TenantIncomingInvoicesResource = class {
|
|
1013
|
+
constructor(http) {
|
|
1014
|
+
this.http = http;
|
|
1015
|
+
}
|
|
1016
|
+
/**
|
|
1017
|
+
* Create a new incoming invoice for a sub-tenant
|
|
1018
|
+
*
|
|
1019
|
+
* Creates a purchase invoice received by a sub-tenant from an external supplier.
|
|
1020
|
+
* The seller's SIREN is validated using the Luhn algorithm.
|
|
1021
|
+
*
|
|
1022
|
+
* @param subTenantId - Sub-tenant UUID
|
|
1023
|
+
* @param params - Invoice creation parameters
|
|
1024
|
+
* @param requestOptions - Optional request configuration
|
|
1025
|
+
* @returns Created invoice
|
|
1026
|
+
*
|
|
1027
|
+
* @example
|
|
1028
|
+
* ```typescript
|
|
1029
|
+
* const { data: invoice } = await client.incomingInvoices.create(
|
|
1030
|
+
* 'sub-tenant-uuid',
|
|
1031
|
+
* {
|
|
1032
|
+
* invoice_number: 'SUPP-2026-001',
|
|
1033
|
+
* company_id: 'company-uuid',
|
|
1034
|
+
* seller: {
|
|
1035
|
+
* company_name: 'Acme Supplies',
|
|
1036
|
+
* siren: '123456789',
|
|
1037
|
+
* siret: '12345678901234',
|
|
1038
|
+
* vat_number: 'FR12123456789',
|
|
1039
|
+
* address: {
|
|
1040
|
+
* line1: '123 Industrial Park',
|
|
1041
|
+
* postal_code: '31000',
|
|
1042
|
+
* city: 'Toulouse',
|
|
1043
|
+
* country: 'FR'
|
|
1044
|
+
* },
|
|
1045
|
+
* email: 'billing@acme-supplies.com'
|
|
1046
|
+
* },
|
|
1047
|
+
* lines: [
|
|
1048
|
+
* {
|
|
1049
|
+
* description: 'Widget A - Bulk order',
|
|
1050
|
+
* quantity: 500,
|
|
1051
|
+
* unit_price: 2.50,
|
|
1052
|
+
* tax_rate: 20,
|
|
1053
|
+
* total_ht: 1250,
|
|
1054
|
+
* total_tax: 250,
|
|
1055
|
+
* total_ttc: 1500
|
|
1056
|
+
* }
|
|
1057
|
+
* ],
|
|
1058
|
+
* issue_date: '2026-01-15',
|
|
1059
|
+
* due_date: '2026-02-15',
|
|
1060
|
+
* total_ht: 1250,
|
|
1061
|
+
* total_ttc: 1500
|
|
1062
|
+
* }
|
|
1063
|
+
* );
|
|
1064
|
+
*
|
|
1065
|
+
* console.log('Incoming invoice created:', invoice.invoice_number);
|
|
1066
|
+
* ```
|
|
1067
|
+
*/
|
|
1068
|
+
async create(subTenantId, params, requestOptions) {
|
|
1069
|
+
return this.http.post(
|
|
1070
|
+
`/tenant/sub-tenants/${subTenantId}/incoming-invoices`,
|
|
1071
|
+
params,
|
|
1072
|
+
requestOptions
|
|
1073
|
+
);
|
|
1074
|
+
}
|
|
1075
|
+
/**
|
|
1076
|
+
* List incoming invoices for a sub-tenant
|
|
1077
|
+
*
|
|
1078
|
+
* Returns a paginated list of purchase invoices received by the sub-tenant.
|
|
1079
|
+
*
|
|
1080
|
+
* @param subTenantId - Sub-tenant UUID
|
|
1081
|
+
* @param filters - Filter and pagination options
|
|
1082
|
+
* @param requestOptions - Optional request configuration
|
|
1083
|
+
* @returns Paginated list of invoices
|
|
1084
|
+
*
|
|
1085
|
+
* @example
|
|
1086
|
+
* ```typescript
|
|
1087
|
+
* // List all pending invoices
|
|
1088
|
+
* const { data: invoices, meta } = await client.incomingInvoices.listForSubTenant(
|
|
1089
|
+
* 'sub-tenant-uuid',
|
|
1090
|
+
* { status: 'pending', per_page: 50 }
|
|
1091
|
+
* );
|
|
1092
|
+
*
|
|
1093
|
+
* console.log(`Found ${meta.total} pending invoices to review`);
|
|
1094
|
+
*
|
|
1095
|
+
* // Filter by supplier
|
|
1096
|
+
* const acmeInvoices = await client.incomingInvoices.listForSubTenant(
|
|
1097
|
+
* 'sub-tenant-uuid',
|
|
1098
|
+
* { seller_siret: '12345678901234' }
|
|
1099
|
+
* );
|
|
1100
|
+
* ```
|
|
1101
|
+
*/
|
|
1102
|
+
async listForSubTenant(subTenantId, filters = {}, requestOptions) {
|
|
1103
|
+
const query = {
|
|
1104
|
+
...filters,
|
|
1105
|
+
status: Array.isArray(filters.status) ? filters.status.join(",") : filters.status
|
|
1106
|
+
};
|
|
1107
|
+
return this.http.get(
|
|
1108
|
+
`/tenant/sub-tenants/${subTenantId}/incoming-invoices`,
|
|
1109
|
+
query,
|
|
1110
|
+
requestOptions
|
|
1111
|
+
);
|
|
1112
|
+
}
|
|
1113
|
+
/**
|
|
1114
|
+
* Get a specific incoming invoice by ID
|
|
1115
|
+
*
|
|
1116
|
+
* @param invoiceId - Invoice UUID
|
|
1117
|
+
* @param requestOptions - Optional request configuration
|
|
1118
|
+
* @returns Invoice details
|
|
1119
|
+
*
|
|
1120
|
+
* @example
|
|
1121
|
+
* ```typescript
|
|
1122
|
+
* const { data: invoice } = await client.incomingInvoices.get('invoice-uuid');
|
|
1123
|
+
*
|
|
1124
|
+
* console.log('Invoice from:', invoice.seller.name);
|
|
1125
|
+
* console.log('Status:', invoice.status);
|
|
1126
|
+
* console.log('Amount:', invoice.total_ttc, invoice.currency);
|
|
1127
|
+
* ```
|
|
1128
|
+
*/
|
|
1129
|
+
async get(invoiceId, requestOptions) {
|
|
1130
|
+
return this.http.get(
|
|
1131
|
+
`/tenant/incoming-invoices/${invoiceId}`,
|
|
1132
|
+
void 0,
|
|
1133
|
+
requestOptions
|
|
1134
|
+
);
|
|
1135
|
+
}
|
|
1136
|
+
/**
|
|
1137
|
+
* Accept an incoming invoice
|
|
1138
|
+
*
|
|
1139
|
+
* Marks the invoice as accepted, indicating approval for payment.
|
|
1140
|
+
* Optionally specify an expected payment date.
|
|
1141
|
+
*
|
|
1142
|
+
* @param invoiceId - Invoice UUID
|
|
1143
|
+
* @param input - Optional acceptance details
|
|
1144
|
+
* @param requestOptions - Optional request configuration
|
|
1145
|
+
* @returns Updated invoice
|
|
1146
|
+
*
|
|
1147
|
+
* @example
|
|
1148
|
+
* ```typescript
|
|
1149
|
+
* // Accept with payment date
|
|
1150
|
+
* const { data: invoice } = await client.incomingInvoices.accept(
|
|
1151
|
+
* 'invoice-uuid',
|
|
1152
|
+
* {
|
|
1153
|
+
* payment_date: '2026-02-15',
|
|
1154
|
+
* note: 'Approved by CFO'
|
|
1155
|
+
* }
|
|
1156
|
+
* );
|
|
1157
|
+
*
|
|
1158
|
+
* console.log('Invoice accepted:', invoice.status); // 'accepted'
|
|
1159
|
+
*
|
|
1160
|
+
* // Simple acceptance
|
|
1161
|
+
* await client.incomingInvoices.accept('invoice-uuid');
|
|
1162
|
+
* ```
|
|
1163
|
+
*/
|
|
1164
|
+
async accept(invoiceId, input, requestOptions) {
|
|
1165
|
+
return this.http.post(
|
|
1166
|
+
`/tenant/incoming-invoices/${invoiceId}/accept`,
|
|
1167
|
+
input,
|
|
1168
|
+
requestOptions
|
|
1169
|
+
);
|
|
1170
|
+
}
|
|
1171
|
+
/**
|
|
1172
|
+
* Reject an incoming invoice
|
|
1173
|
+
*
|
|
1174
|
+
* Marks the invoice as rejected with a reason and optional code.
|
|
1175
|
+
*
|
|
1176
|
+
* @param invoiceId - Invoice UUID
|
|
1177
|
+
* @param reason - Reason for rejection
|
|
1178
|
+
* @param code - Optional standardized rejection code
|
|
1179
|
+
* @param requestOptions - Optional request configuration
|
|
1180
|
+
* @returns Updated invoice
|
|
1181
|
+
*
|
|
1182
|
+
* @example
|
|
1183
|
+
* ```typescript
|
|
1184
|
+
* const { data: invoice } = await client.incomingInvoices.reject(
|
|
1185
|
+
* 'invoice-uuid',
|
|
1186
|
+
* 'Amount does not match purchase order PO-2026-042',
|
|
1187
|
+
* 'incorrect_amount'
|
|
1188
|
+
* );
|
|
1189
|
+
*
|
|
1190
|
+
* console.log('Invoice rejected:', invoice.status); // 'rejected'
|
|
1191
|
+
* ```
|
|
1192
|
+
*/
|
|
1193
|
+
async reject(invoiceId, reason, code, requestOptions) {
|
|
1194
|
+
const input = { reason };
|
|
1195
|
+
if (code) {
|
|
1196
|
+
input.reason_code = code;
|
|
1197
|
+
}
|
|
1198
|
+
return this.http.post(
|
|
1199
|
+
`/tenant/incoming-invoices/${invoiceId}/reject`,
|
|
1200
|
+
input,
|
|
1201
|
+
requestOptions
|
|
1202
|
+
);
|
|
1203
|
+
}
|
|
1204
|
+
/**
|
|
1205
|
+
* Mark an incoming invoice as paid
|
|
1206
|
+
*
|
|
1207
|
+
* Records payment information for an accepted invoice.
|
|
1208
|
+
* This is a mandatory step in the French e-invoicing lifecycle.
|
|
1209
|
+
*
|
|
1210
|
+
* @param invoiceId - Invoice UUID
|
|
1211
|
+
* @param input - Optional payment details
|
|
1212
|
+
* @param requestOptions - Optional request configuration
|
|
1213
|
+
* @returns Updated invoice with payment information
|
|
1214
|
+
*
|
|
1215
|
+
* @example
|
|
1216
|
+
* ```typescript
|
|
1217
|
+
* // Mark as paid with details
|
|
1218
|
+
* const { data: invoice } = await client.incomingInvoices.markPaid(
|
|
1219
|
+
* 'invoice-uuid',
|
|
1220
|
+
* {
|
|
1221
|
+
* payment_reference: 'VIR-2026-0150',
|
|
1222
|
+
* paid_at: '2026-02-14T14:30:00Z',
|
|
1223
|
+
* note: 'Payment via bank transfer'
|
|
1224
|
+
* }
|
|
1225
|
+
* );
|
|
1226
|
+
*
|
|
1227
|
+
* console.log('Invoice paid:', invoice.status); // 'paid'
|
|
1228
|
+
* console.log('Payment ref:', invoice.payment_reference);
|
|
1229
|
+
*
|
|
1230
|
+
* // Simple mark as paid (current date)
|
|
1231
|
+
* await client.incomingInvoices.markPaid('invoice-uuid');
|
|
1232
|
+
* ```
|
|
1233
|
+
*/
|
|
1234
|
+
async markPaid(invoiceId, input, requestOptions) {
|
|
1235
|
+
return this.http.post(
|
|
1236
|
+
`/tenant/incoming-invoices/${invoiceId}/mark-paid`,
|
|
1237
|
+
input,
|
|
1238
|
+
requestOptions
|
|
1239
|
+
);
|
|
1240
|
+
}
|
|
1241
|
+
/**
|
|
1242
|
+
* Delete an incoming invoice
|
|
1243
|
+
*
|
|
1244
|
+
* Only invoices in 'pending' status can be deleted.
|
|
1245
|
+
*
|
|
1246
|
+
* @param invoiceId - Invoice UUID
|
|
1247
|
+
* @param requestOptions - Optional request configuration
|
|
1248
|
+
*
|
|
1249
|
+
* @example
|
|
1250
|
+
* ```typescript
|
|
1251
|
+
* await client.incomingInvoices.delete('pending-invoice-uuid');
|
|
1252
|
+
* console.log('Incoming invoice deleted');
|
|
1253
|
+
* ```
|
|
1254
|
+
*/
|
|
1255
|
+
async delete(invoiceId, requestOptions) {
|
|
1256
|
+
return this.http.delete(
|
|
1257
|
+
`/tenant/incoming-invoices/${invoiceId}`,
|
|
1258
|
+
requestOptions
|
|
1259
|
+
);
|
|
1260
|
+
}
|
|
1261
|
+
/**
|
|
1262
|
+
* Download incoming invoice as PDF
|
|
1263
|
+
*
|
|
1264
|
+
* @param invoiceId - Invoice UUID
|
|
1265
|
+
* @param requestOptions - Optional request configuration
|
|
1266
|
+
* @returns ArrayBuffer containing the PDF file
|
|
1267
|
+
*
|
|
1268
|
+
* @example
|
|
1269
|
+
* ```typescript
|
|
1270
|
+
* const pdfBuffer = await client.incomingInvoices.download('invoice-uuid');
|
|
1271
|
+
*
|
|
1272
|
+
* // Save to file (Node.js)
|
|
1273
|
+
* import { writeFileSync } from 'fs';
|
|
1274
|
+
* writeFileSync('supplier-invoice.pdf', Buffer.from(pdfBuffer));
|
|
1275
|
+
* ```
|
|
1276
|
+
*/
|
|
1277
|
+
async download(invoiceId, requestOptions) {
|
|
1278
|
+
return this.http.getRaw(
|
|
1279
|
+
`/tenant/incoming-invoices/${invoiceId}/download`,
|
|
1280
|
+
void 0,
|
|
1281
|
+
requestOptions
|
|
1282
|
+
);
|
|
1283
|
+
}
|
|
1284
|
+
};
|
|
1285
|
+
|
|
1286
|
+
// src/resources/tenant-credit-notes.ts
|
|
1287
|
+
var TenantCreditNotesResource = class {
|
|
1288
|
+
constructor(http) {
|
|
1289
|
+
this.http = http;
|
|
1290
|
+
}
|
|
1291
|
+
/**
|
|
1292
|
+
* List credit notes for a sub-tenant
|
|
1293
|
+
*
|
|
1294
|
+
* @param subTenantId - Sub-tenant UUID
|
|
1295
|
+
* @param options - Filter and pagination options
|
|
1296
|
+
* @param requestOptions - Request options
|
|
1297
|
+
* @returns Paginated list of credit notes
|
|
1298
|
+
*
|
|
1299
|
+
* @example
|
|
1300
|
+
* ```typescript
|
|
1301
|
+
* const { data, meta } = await client.tenantCreditNotes.list('sub-tenant-uuid', {
|
|
1302
|
+
* status: 'sent',
|
|
1303
|
+
* date_from: '2024-01-01',
|
|
1304
|
+
* per_page: 50
|
|
1305
|
+
* });
|
|
1306
|
+
* console.log(`Found ${meta.total} credit notes`);
|
|
1307
|
+
* ```
|
|
1308
|
+
*/
|
|
1309
|
+
async list(subTenantId, options = {}, requestOptions) {
|
|
1310
|
+
return this.http.get(
|
|
1311
|
+
`/tenant/sub-tenants/${subTenantId}/credit-notes`,
|
|
1312
|
+
options,
|
|
1313
|
+
requestOptions
|
|
1314
|
+
);
|
|
1315
|
+
}
|
|
1316
|
+
/**
|
|
1317
|
+
* Create a new credit note for a sub-tenant invoice
|
|
1318
|
+
*
|
|
1319
|
+
* @param subTenantId - Sub-tenant UUID
|
|
1320
|
+
* @param input - Credit note creation data
|
|
1321
|
+
* @param requestOptions - Request options
|
|
1322
|
+
* @returns Created credit note
|
|
1323
|
+
*
|
|
1324
|
+
* @example
|
|
1325
|
+
* ```typescript
|
|
1326
|
+
* // Create a partial credit note
|
|
1327
|
+
* const { data: creditNote } = await client.tenantCreditNotes.create(
|
|
1328
|
+
* 'sub-tenant-uuid',
|
|
1329
|
+
* {
|
|
1330
|
+
* invoice_id: 'invoice-uuid',
|
|
1331
|
+
* reason: 'Product returned - damaged item',
|
|
1332
|
+
* type: 'partial',
|
|
1333
|
+
* items: [
|
|
1334
|
+
* { invoice_line_id: 'line-uuid-1', quantity: 2 }
|
|
1335
|
+
* ]
|
|
1336
|
+
* }
|
|
1337
|
+
* );
|
|
1338
|
+
*
|
|
1339
|
+
* // Create a total credit note
|
|
1340
|
+
* const { data: totalCreditNote } = await client.tenantCreditNotes.create(
|
|
1341
|
+
* 'sub-tenant-uuid',
|
|
1342
|
+
* {
|
|
1343
|
+
* invoice_id: 'invoice-uuid',
|
|
1344
|
+
* reason: 'Order cancelled',
|
|
1345
|
+
* type: 'total'
|
|
1346
|
+
* }
|
|
1347
|
+
* );
|
|
1348
|
+
* ```
|
|
1349
|
+
*/
|
|
1350
|
+
async create(subTenantId, input, requestOptions) {
|
|
1351
|
+
return this.http.post(
|
|
1352
|
+
`/tenant/sub-tenants/${subTenantId}/credit-notes`,
|
|
1353
|
+
input,
|
|
1354
|
+
requestOptions
|
|
1355
|
+
);
|
|
1356
|
+
}
|
|
1357
|
+
/**
|
|
1358
|
+
* Get a specific credit note by ID
|
|
1359
|
+
*
|
|
1360
|
+
* @param creditNoteId - Credit note UUID
|
|
1361
|
+
* @param requestOptions - Request options
|
|
1362
|
+
* @returns Credit note details
|
|
1363
|
+
*
|
|
1364
|
+
* @example
|
|
1365
|
+
* ```typescript
|
|
1366
|
+
* const { data: creditNote } = await client.tenantCreditNotes.get('credit-note-uuid');
|
|
1367
|
+
* console.log('Credit note number:', creditNote.credit_note_number);
|
|
1368
|
+
* console.log('Total:', creditNote.total, creditNote.currency);
|
|
1369
|
+
* ```
|
|
1370
|
+
*/
|
|
1371
|
+
async get(creditNoteId, requestOptions) {
|
|
1372
|
+
return this.http.get(
|
|
1373
|
+
`/tenant/credit-notes/${creditNoteId}`,
|
|
1374
|
+
void 0,
|
|
1375
|
+
requestOptions
|
|
1376
|
+
);
|
|
1377
|
+
}
|
|
1378
|
+
/**
|
|
1379
|
+
* Update a credit note
|
|
1380
|
+
*
|
|
1381
|
+
* Only credit notes in 'draft' status can be updated.
|
|
1382
|
+
*
|
|
1383
|
+
* @param creditNoteId - Credit note UUID
|
|
1384
|
+
* @param input - Update data
|
|
1385
|
+
* @param requestOptions - Request options
|
|
1386
|
+
* @returns Updated credit note
|
|
1387
|
+
*
|
|
1388
|
+
* @example
|
|
1389
|
+
* ```typescript
|
|
1390
|
+
* const { data: creditNote } = await client.tenantCreditNotes.update(
|
|
1391
|
+
* 'credit-note-uuid',
|
|
1392
|
+
* {
|
|
1393
|
+
* reason: 'Updated reason: Customer complaint resolved',
|
|
1394
|
+
* items: [
|
|
1395
|
+
* { invoice_line_id: 'line-uuid', quantity: 3 }
|
|
1396
|
+
* ]
|
|
1397
|
+
* }
|
|
1398
|
+
* );
|
|
1399
|
+
* console.log('Credit note updated:', creditNote.reason);
|
|
1400
|
+
* ```
|
|
1401
|
+
*/
|
|
1402
|
+
async update(creditNoteId, input, requestOptions) {
|
|
1403
|
+
return this.http.patch(
|
|
1404
|
+
`/tenant/credit-notes/${creditNoteId}`,
|
|
1405
|
+
input,
|
|
1406
|
+
requestOptions
|
|
1407
|
+
);
|
|
1408
|
+
}
|
|
1409
|
+
/**
|
|
1410
|
+
* Send a credit note
|
|
1411
|
+
*
|
|
1412
|
+
* Changes the status from 'draft' to 'sent'.
|
|
1413
|
+
*
|
|
1414
|
+
* @param creditNoteId - Credit note UUID
|
|
1415
|
+
* @param requestOptions - Request options
|
|
1416
|
+
* @returns Updated credit note
|
|
1417
|
+
*
|
|
1418
|
+
* @example
|
|
1419
|
+
* ```typescript
|
|
1420
|
+
* const { data: sentCreditNote } = await client.tenantCreditNotes.send('credit-note-uuid');
|
|
1421
|
+
* console.log('Status:', sentCreditNote.status); // 'sent'
|
|
1422
|
+
* ```
|
|
1423
|
+
*/
|
|
1424
|
+
async send(creditNoteId, requestOptions) {
|
|
1425
|
+
return this.http.post(
|
|
1426
|
+
`/tenant/credit-notes/${creditNoteId}/send`,
|
|
1427
|
+
void 0,
|
|
1428
|
+
requestOptions
|
|
1429
|
+
);
|
|
1430
|
+
}
|
|
1431
|
+
/**
|
|
1432
|
+
* Delete a credit note (draft only)
|
|
1433
|
+
*
|
|
1434
|
+
* Only credit notes with status 'draft' can be deleted.
|
|
1435
|
+
*
|
|
1436
|
+
* @param creditNoteId - Credit note UUID
|
|
1437
|
+
* @param requestOptions - Request options
|
|
1438
|
+
*
|
|
1439
|
+
* @example
|
|
1440
|
+
* ```typescript
|
|
1441
|
+
* await client.tenantCreditNotes.delete('credit-note-uuid');
|
|
1442
|
+
* ```
|
|
1443
|
+
*/
|
|
1444
|
+
async delete(creditNoteId, requestOptions) {
|
|
1445
|
+
return this.http.delete(
|
|
1446
|
+
`/tenant/credit-notes/${creditNoteId}`,
|
|
1447
|
+
requestOptions
|
|
1448
|
+
);
|
|
1449
|
+
}
|
|
1450
|
+
/**
|
|
1451
|
+
* Download credit note as PDF
|
|
1452
|
+
*
|
|
1453
|
+
* @param creditNoteId - Credit note UUID
|
|
1454
|
+
* @param requestOptions - Request options
|
|
1455
|
+
* @returns ArrayBuffer containing the PDF file
|
|
1456
|
+
*
|
|
1457
|
+
* @example
|
|
1458
|
+
* ```typescript
|
|
1459
|
+
* // Download credit note PDF
|
|
1460
|
+
* const pdfBuffer = await client.tenantCreditNotes.download('credit-note-uuid');
|
|
1461
|
+
*
|
|
1462
|
+
* // In Node.js, save to file:
|
|
1463
|
+
* import { writeFileSync } from 'fs';
|
|
1464
|
+
* writeFileSync('credit-note.pdf', Buffer.from(pdfBuffer));
|
|
1465
|
+
*
|
|
1466
|
+
* // In browser, trigger download:
|
|
1467
|
+
* const blob = new Blob([pdfBuffer], { type: 'application/pdf' });
|
|
1468
|
+
* const url = URL.createObjectURL(blob);
|
|
1469
|
+
* const a = document.createElement('a');
|
|
1470
|
+
* a.href = url;
|
|
1471
|
+
* a.download = 'credit-note.pdf';
|
|
1472
|
+
* a.click();
|
|
1473
|
+
* ```
|
|
1474
|
+
*/
|
|
1475
|
+
async download(creditNoteId, requestOptions) {
|
|
1476
|
+
return this.http.getRaw(
|
|
1477
|
+
`/tenant/credit-notes/${creditNoteId}/download`,
|
|
1478
|
+
void 0,
|
|
1479
|
+
requestOptions
|
|
1480
|
+
);
|
|
1481
|
+
}
|
|
1482
|
+
/**
|
|
1483
|
+
* Get remaining creditable amount for an invoice
|
|
1484
|
+
*
|
|
1485
|
+
* Returns information about how much can still be credited for an invoice,
|
|
1486
|
+
* including per-line breakdown.
|
|
1487
|
+
*
|
|
1488
|
+
* @param invoiceId - Invoice UUID
|
|
1489
|
+
* @param requestOptions - Request options
|
|
1490
|
+
* @returns Remaining creditable information
|
|
1491
|
+
*
|
|
1492
|
+
* @example
|
|
1493
|
+
* ```typescript
|
|
1494
|
+
* const remaining = await client.tenantCreditNotes.remainingCreditable('invoice-uuid');
|
|
1495
|
+
*
|
|
1496
|
+
* console.log('Invoice total:', remaining.invoice_total);
|
|
1497
|
+
* console.log('Already credited:', remaining.credited_total);
|
|
1498
|
+
* console.log('Remaining to credit:', remaining.remaining_total);
|
|
1499
|
+
*
|
|
1500
|
+
* // Check remaining quantity per line
|
|
1501
|
+
* remaining.lines.forEach(line => {
|
|
1502
|
+
* console.log(`${line.description}: ${line.remaining_quantity} remaining`);
|
|
1503
|
+
* });
|
|
1504
|
+
* ```
|
|
1505
|
+
*/
|
|
1506
|
+
async remainingCreditable(invoiceId, requestOptions) {
|
|
1507
|
+
return this.http.get(
|
|
1508
|
+
`/tenant/invoices/${invoiceId}/remaining-creditable`,
|
|
1509
|
+
void 0,
|
|
1510
|
+
requestOptions
|
|
1511
|
+
);
|
|
1512
|
+
}
|
|
1513
|
+
};
|
|
1514
|
+
|
|
1515
|
+
// src/resources/fiscal.ts
|
|
1516
|
+
var FiscalResource = class {
|
|
1517
|
+
constructor(http) {
|
|
1518
|
+
this.http = http;
|
|
1519
|
+
}
|
|
1520
|
+
async compliance(requestOptions) {
|
|
1521
|
+
return this.http.get("/tenant/fiscal/compliance", void 0, requestOptions);
|
|
1522
|
+
}
|
|
1523
|
+
async integrity(options = {}, requestOptions) {
|
|
1524
|
+
return this.http.get("/tenant/fiscal/integrity", options, requestOptions);
|
|
1525
|
+
}
|
|
1526
|
+
async integrityHistory(options = {}, requestOptions) {
|
|
1527
|
+
return this.http.get("/tenant/fiscal/integrity/history", options, requestOptions);
|
|
1528
|
+
}
|
|
1529
|
+
async integrityForDate(date, requestOptions) {
|
|
1530
|
+
return this.http.get(`/tenant/fiscal/integrity/${date}`, void 0, requestOptions);
|
|
1531
|
+
}
|
|
1532
|
+
async closings(options = {}, requestOptions) {
|
|
1533
|
+
return this.http.get("/tenant/fiscal/closings", options, requestOptions);
|
|
1534
|
+
}
|
|
1535
|
+
async performDailyClosing(input = {}, requestOptions) {
|
|
1536
|
+
return this.http.post("/tenant/fiscal/closings/daily", input, requestOptions);
|
|
1537
|
+
}
|
|
1538
|
+
async fecExport(options, requestOptions) {
|
|
1539
|
+
return this.http.get("/tenant/fiscal/fec", options, requestOptions);
|
|
1540
|
+
}
|
|
1541
|
+
async fecDownload(options, requestOptions) {
|
|
1542
|
+
return this.http.getRaw("/tenant/fiscal/fec", { ...options, download: true }, requestOptions);
|
|
1543
|
+
}
|
|
1544
|
+
async attestation(year, requestOptions) {
|
|
1545
|
+
return this.http.get(`/tenant/fiscal/attestation/${year}`, void 0, requestOptions);
|
|
1546
|
+
}
|
|
1547
|
+
async attestationDownload(year, requestOptions) {
|
|
1548
|
+
return this.http.getRaw(`/tenant/fiscal/attestation/${year}/download`, void 0, requestOptions);
|
|
1549
|
+
}
|
|
1550
|
+
async entries(options = {}, requestOptions) {
|
|
1551
|
+
return this.http.get("/tenant/fiscal/entries", options, requestOptions);
|
|
1552
|
+
}
|
|
1553
|
+
async killSwitchStatus(requestOptions) {
|
|
1554
|
+
return this.http.get("/tenant/fiscal/kill-switch/status", void 0, requestOptions);
|
|
1555
|
+
}
|
|
1556
|
+
async killSwitchActivate(input, requestOptions) {
|
|
1557
|
+
return this.http.post("/tenant/fiscal/kill-switch/activate", input, requestOptions);
|
|
1558
|
+
}
|
|
1559
|
+
async killSwitchDeactivate(requestOptions) {
|
|
1560
|
+
return this.http.post("/tenant/fiscal/kill-switch/deactivate", void 0, requestOptions);
|
|
1561
|
+
}
|
|
1562
|
+
async anchors(options = {}, requestOptions) {
|
|
1563
|
+
return this.http.get("/tenant/fiscal/anchors", options, requestOptions);
|
|
1564
|
+
}
|
|
1565
|
+
async rules(options = {}, requestOptions) {
|
|
1566
|
+
return this.http.get("/tenant/fiscal/rules", options, requestOptions);
|
|
1567
|
+
}
|
|
1568
|
+
async ruleDetail(key, requestOptions) {
|
|
1569
|
+
return this.http.get(`/tenant/fiscal/rules/${key}`, void 0, requestOptions);
|
|
1570
|
+
}
|
|
1571
|
+
async ruleHistory(key, requestOptions) {
|
|
1572
|
+
return this.http.get(`/tenant/fiscal/rules/${key}/history`, void 0, requestOptions);
|
|
1573
|
+
}
|
|
1574
|
+
async createRule(input, requestOptions) {
|
|
1575
|
+
return this.http.post("/tenant/fiscal/rules", input, requestOptions);
|
|
1576
|
+
}
|
|
1577
|
+
async updateRule(id, input, requestOptions) {
|
|
1578
|
+
return this.http.post(`/tenant/fiscal/rules/${id}`, input, requestOptions);
|
|
1579
|
+
}
|
|
1580
|
+
async exportRules(options, requestOptions) {
|
|
1581
|
+
return this.http.get("/tenant/fiscal/rules/export", options, requestOptions);
|
|
1582
|
+
}
|
|
1583
|
+
async replayRules(input, requestOptions) {
|
|
1584
|
+
return this.http.post("/tenant/fiscal/rules/replay", input, requestOptions);
|
|
1585
|
+
}
|
|
1586
|
+
async forensicExport(options, requestOptions) {
|
|
1587
|
+
return this.http.get("/tenant/fiscal/forensic-export", options, requestOptions);
|
|
1588
|
+
}
|
|
1589
|
+
};
|
|
1590
|
+
|
|
1591
|
+
// src/resources/billing.ts
|
|
1592
|
+
var BillingResource = class {
|
|
1593
|
+
constructor(http) {
|
|
1594
|
+
this.http = http;
|
|
1595
|
+
}
|
|
1596
|
+
async invoices(options = {}, requestOptions) {
|
|
1597
|
+
return this.http.get("/tenant/billing/invoices", options, requestOptions);
|
|
1598
|
+
}
|
|
1599
|
+
async showInvoice(invoiceId, requestOptions) {
|
|
1600
|
+
return this.http.get(`/tenant/billing/invoices/${invoiceId}`, void 0, requestOptions);
|
|
1601
|
+
}
|
|
1602
|
+
async downloadInvoice(invoiceId, requestOptions) {
|
|
1603
|
+
return this.http.getRaw(`/tenant/billing/invoices/${invoiceId}/download`, void 0, requestOptions);
|
|
1604
|
+
}
|
|
1605
|
+
async usage(options = {}, requestOptions) {
|
|
1606
|
+
return this.http.get("/tenant/billing/usage", options, requestOptions);
|
|
1607
|
+
}
|
|
1608
|
+
async topUp(input, requestOptions) {
|
|
1609
|
+
return this.http.post("/tenant/billing/top-up", input, requestOptions);
|
|
1610
|
+
}
|
|
1611
|
+
async confirmTopUp(input, requestOptions) {
|
|
1612
|
+
return this.http.post("/tenant/billing/top-up/confirm", input, requestOptions);
|
|
1613
|
+
}
|
|
1614
|
+
async transactions(options = {}, requestOptions) {
|
|
1615
|
+
return this.http.get("/tenant/billing/transactions", options, requestOptions);
|
|
1616
|
+
}
|
|
1617
|
+
};
|
|
1618
|
+
|
|
1619
|
+
// src/resources/stats.ts
|
|
1620
|
+
var StatsResource = class {
|
|
1621
|
+
constructor(http) {
|
|
1622
|
+
this.http = http;
|
|
1623
|
+
}
|
|
1624
|
+
async overview(options = {}, requestOptions) {
|
|
1625
|
+
return this.http.get("/tenant/stats/overview", options, requestOptions);
|
|
1626
|
+
}
|
|
1627
|
+
async monthly(options = {}, requestOptions) {
|
|
1628
|
+
return this.http.get("/tenant/stats/monthly", options, requestOptions);
|
|
1629
|
+
}
|
|
1630
|
+
async subTenantOverview(subTenantId, options = {}, requestOptions) {
|
|
1631
|
+
return this.http.get(`/tenant/sub-tenants/${subTenantId}/stats/overview`, options, requestOptions);
|
|
1632
|
+
}
|
|
1633
|
+
};
|
|
1634
|
+
|
|
1635
|
+
// src/resources/sub-tenants.ts
|
|
1636
|
+
var SubTenantsResource = class {
|
|
1637
|
+
constructor(http) {
|
|
1638
|
+
this.http = http;
|
|
1639
|
+
}
|
|
1640
|
+
async list(options = {}, requestOptions) {
|
|
1641
|
+
return this.http.get("/tenant/sub-tenants", options, requestOptions);
|
|
1642
|
+
}
|
|
1643
|
+
async create(input, requestOptions) {
|
|
1644
|
+
return this.http.post("/tenant/sub-tenants", input, requestOptions);
|
|
1645
|
+
}
|
|
1646
|
+
async get(id, requestOptions) {
|
|
1647
|
+
return this.http.get(`/tenant/sub-tenants/${id}`, void 0, requestOptions);
|
|
1648
|
+
}
|
|
1649
|
+
async update(id, input, requestOptions) {
|
|
1650
|
+
return this.http.patch(`/tenant/sub-tenants/${id}`, input, requestOptions);
|
|
1651
|
+
}
|
|
1652
|
+
async delete(id, requestOptions) {
|
|
1653
|
+
return this.http.delete(`/tenant/sub-tenants/${id}`, requestOptions);
|
|
1654
|
+
}
|
|
1655
|
+
async findByExternalId(externalId, requestOptions) {
|
|
1656
|
+
return this.http.get(`/tenant/sub-tenants/by-external-id/${externalId}`, void 0, requestOptions);
|
|
1657
|
+
}
|
|
1658
|
+
};
|
|
1659
|
+
|
|
1660
|
+
// src/tenant-client.ts
|
|
1661
|
+
var ScellTenantClient = class {
|
|
1662
|
+
http;
|
|
1663
|
+
/** Direct invoices resource */
|
|
1664
|
+
directInvoices;
|
|
1665
|
+
/** Direct credit notes resource */
|
|
1666
|
+
directCreditNotes;
|
|
1667
|
+
/** Incoming invoices resource */
|
|
1668
|
+
incomingInvoices;
|
|
1669
|
+
/** Sub-tenant credit notes resource */
|
|
1670
|
+
subTenantCreditNotes;
|
|
1671
|
+
/** Fiscal compliance resource (LF 2026) */
|
|
1672
|
+
fiscal;
|
|
1673
|
+
/** Billing resource */
|
|
1674
|
+
billing;
|
|
1675
|
+
/** Stats resource */
|
|
1676
|
+
stats;
|
|
1677
|
+
/** Sub-tenants resource */
|
|
1678
|
+
subTenants;
|
|
1679
|
+
/**
|
|
1680
|
+
* Create a new Scell Tenant Client
|
|
1681
|
+
*
|
|
1682
|
+
* @param tenantKey - Your tenant API key (from dashboard)
|
|
1683
|
+
* @param config - Optional client configuration
|
|
1684
|
+
*/
|
|
1685
|
+
constructor(tenantKey, config = {}) {
|
|
1686
|
+
this.http = new HttpClient("tenant-key", tenantKey, config);
|
|
1687
|
+
this.directInvoices = new TenantDirectInvoicesResource(this.http);
|
|
1688
|
+
this.directCreditNotes = new TenantDirectCreditNotesResource(this.http);
|
|
1689
|
+
this.incomingInvoices = new TenantIncomingInvoicesResource(this.http);
|
|
1690
|
+
this.subTenantCreditNotes = new TenantCreditNotesResource(this.http);
|
|
1691
|
+
this.fiscal = new FiscalResource(this.http);
|
|
1692
|
+
this.billing = new BillingResource(this.http);
|
|
1693
|
+
this.stats = new StatsResource(this.http);
|
|
1694
|
+
this.subTenants = new SubTenantsResource(this.http);
|
|
1695
|
+
}
|
|
1696
|
+
// ── Tenant Profile Methods ──────────────────────────────
|
|
1697
|
+
/** Get tenant profile */
|
|
1698
|
+
async me(requestOptions) {
|
|
1699
|
+
return this.http.get("/tenant/me", void 0, requestOptions);
|
|
1700
|
+
}
|
|
1701
|
+
/** Update tenant profile */
|
|
1702
|
+
async updateProfile(input, requestOptions) {
|
|
1703
|
+
return this.http.post("/tenant/me", input, requestOptions);
|
|
1704
|
+
}
|
|
1705
|
+
/** Get tenant balance */
|
|
1706
|
+
async balance(requestOptions) {
|
|
1707
|
+
return this.http.get("/tenant/balance", void 0, requestOptions);
|
|
1708
|
+
}
|
|
1709
|
+
/** Get quick stats */
|
|
1710
|
+
async quickStats(requestOptions) {
|
|
1711
|
+
return this.http.get("/tenant/stats", void 0, requestOptions);
|
|
1712
|
+
}
|
|
1713
|
+
/** Regenerate tenant key */
|
|
1714
|
+
async regenerateKey(requestOptions) {
|
|
1715
|
+
return this.http.post("/tenant/regenerate-key", void 0, requestOptions);
|
|
1716
|
+
}
|
|
1717
|
+
};
|
|
1718
|
+
|
|
462
1719
|
// src/resources/api-keys.ts
|
|
463
1720
|
var ApiKeysResource = class {
|
|
464
1721
|
constructor(http) {
|
|
@@ -1957,6 +3214,8 @@ var ScellApiClient = class {
|
|
|
1957
3214
|
invoices;
|
|
1958
3215
|
/** Signature operations (create, download, remind, cancel) */
|
|
1959
3216
|
signatures;
|
|
3217
|
+
/** Tenant credit notes operations (create, send, download) */
|
|
3218
|
+
tenantCreditNotes;
|
|
1960
3219
|
/**
|
|
1961
3220
|
* Create a new Scell API Client
|
|
1962
3221
|
*
|
|
@@ -1978,12 +3237,14 @@ var ScellApiClient = class {
|
|
|
1978
3237
|
this.http = new HttpClient("api-key", apiKey, config);
|
|
1979
3238
|
this.invoices = new InvoicesResource(this.http);
|
|
1980
3239
|
this.signatures = new SignaturesResource(this.http);
|
|
3240
|
+
this.tenantCreditNotes = new TenantCreditNotesResource(this.http);
|
|
1981
3241
|
}
|
|
1982
3242
|
};
|
|
1983
3243
|
|
|
1984
3244
|
exports.ScellApiClient = ScellApiClient;
|
|
1985
3245
|
exports.ScellAuth = ScellAuth;
|
|
1986
3246
|
exports.ScellClient = ScellClient;
|
|
3247
|
+
exports.ScellTenantClient = ScellTenantClient;
|
|
1987
3248
|
exports.ScellWebhooks = ScellWebhooks;
|
|
1988
3249
|
exports.createRetryWrapper = createRetryWrapper;
|
|
1989
3250
|
exports.withRetry = withRetry;
|