@dodobrands/pos-receipts-plugin-contracts 5.13.2 → 5.13.4

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.en.md ADDED
@@ -0,0 +1,36 @@
1
+ # @dodobrands/pos-receipts-plugin-contracts
2
+
3
+ Public contracts for fiscal cash register (Cash Register) plugins. Implemented by fiscal printer plugin authors.
4
+
5
+ Full documentation: [dodopizza.github.io/cashierapp](https://dodopizza.github.io/cashierapp/)
6
+
7
+ ---
8
+
9
+ ## Main Interface: `ICashRegister`
10
+
11
+ ```ts
12
+ export interface ICashRegister {
13
+ initialize?: (options: InitializationOptions) => Promise<void>;
14
+ getSettings: () => Promise<CashRegisterSettings>;
15
+ handleSale: (request: HandleSaleRequest) => Promise<PrintedReceipt>;
16
+
17
+ // Optional
18
+ handleRefund?: (request: HandleRefundRequest) => Promise<PrintedRefundReceipt>;
19
+ makeXReport?: () => Promise<void>;
20
+ makeZReport?: (options: MakeZReportOptions) => Promise<void>;
21
+ withdrawCash?: (options: WithdrawCashOptions) => Promise<void>;
22
+ depositCash?: (options: DepositCashOptions) => Promise<void>;
23
+ printText?: (options: PrintTextOptions) => Promise<void>;
24
+ }
25
+ ```
26
+
27
+ Start by exploring [`src/ICashRegister.ts`](./src/ICashRegister.ts).
28
+
29
+ The `Receipt` type contains complete information about the order, customer, taxes, organization, and country-specific marking data (Russia, Belarus, Uzbekistan, Kazakhstan).
30
+
31
+ ---
32
+
33
+ ## Related Packages
34
+
35
+ - [`@dodopizza/pos-receipts-ipc-client`](../../private/pos-receipts-ipc-client/README.en.md) — ready-made IPC client for Electron using these contracts
36
+ - [`@dodobrands/pos-plugins-shared-models`](../../shared/pos-plugins-shared-models/README.en.md) — shared models (`Business`, `Country`, `ILogger`)
package/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # @dodobrands/pos-receipts-plugin-contracts
2
+
3
+ Публичные контракты для плагинов фискальных касс (Cash Register). Реализуется авторами плагинов фискальных принтеров.
4
+
5
+ Полная документация: [dodopizza.github.io/cashierapp](https://dodopizza.github.io/cashierapp/)
6
+
7
+ ---
8
+
9
+ ## Основной интерфейс: `ICashRegister`
10
+
11
+ ```ts
12
+ export interface ICashRegister {
13
+ initialize?: (options: InitializationOptions) => Promise<void>;
14
+ getSettings: () => Promise<CashRegisterSettings>;
15
+ handleSale: (request: HandleSaleRequest) => Promise<PrintedReceipt>;
16
+
17
+ // Опциональные
18
+ handleRefund?: (request: HandleRefundRequest) => Promise<PrintedRefundReceipt>;
19
+ makeXReport?: () => Promise<void>;
20
+ makeZReport?: (options: MakeZReportOptions) => Promise<void>;
21
+ withdrawCash?: (options: WithdrawCashOptions) => Promise<void>;
22
+ depositCash?: (options: DepositCashOptions) => Promise<void>;
23
+ printText?: (options: PrintTextOptions) => Promise<void>;
24
+ }
25
+ ```
26
+
27
+ Начните с изучения [`src/ICashRegister.ts`](./src/ICashRegister.ts).
28
+
29
+ Тип `Receipt` содержит полную информацию о заказе, покупателе, налогах, организации и страно-специфичных данных маркировки (Россия, Беларусь, Узбекистан, Казахстан).
30
+
31
+ ---
32
+
33
+ ## Смежные пакеты
34
+
35
+ - [`@dodopizza/pos-receipts-ipc-client`](../../private/pos-receipts-ipc-client/README.md) — готовый IPC-клиент для Electron, использующий эти контракты
36
+ - [`@dodobrands/pos-plugins-shared-models`](../../shared/pos-plugins-shared-models/README.md) — общие модели (`Business`, `Country`, `ILogger`)
package/dist/index.d.cts CHANGED
@@ -106,6 +106,29 @@ interface ILogger<TScope extends Record<string, unknown> = never> {
106
106
  fatal<T>(message: string, error?: unknown, metadata?: ErrorMessageMetadataWith<T>): void;
107
107
  }
108
108
 
109
+ interface IDigitalReceipt {
110
+ views: DigitalReceiptView[];
111
+ fields?: Fields;
112
+ version: 'v1';
113
+ }
114
+ type DigitalReceiptViewType = 'mobile' | 'email' | 'link' | 'pos';
115
+ type DigitalReceiptView = {
116
+ type: DigitalReceiptViewType;
117
+ data: string;
118
+ };
119
+ type Fields = {
120
+ type: 'FPtr10';
121
+ fnNumber: string;
122
+ fiscalDocumentSign: string;
123
+ fiscalDocumentNumber: string;
124
+ };
125
+
126
+ type FiscalizationPayload = {
127
+ ReceiptId: string;
128
+ Payload: string;
129
+ DigitalReceipt: IDigitalReceipt;
130
+ };
131
+
109
132
  /**
110
133
  * Unique identifier of the transaction
111
134
  */
@@ -189,11 +212,17 @@ type TextSlipData = {
189
212
  */
190
213
  type SlipData = TextSlipData;
191
214
 
192
- type QrPaymentResult = {
215
+ type BasePaymentResult = {
193
216
  /**
194
217
  * Information about the payment.
195
218
  */
196
219
  paymentInfo: PaymentInfo;
220
+ /**
221
+ * Fiscalization payload returned by 2-in-1 devices.
222
+ */
223
+ fiscalizationPayload?: FiscalizationPayload;
224
+ };
225
+ type QrPaymentResult = BasePaymentResult & {
197
226
  /**
198
227
  * QR code data
199
228
  */
@@ -202,11 +231,7 @@ type QrPaymentResult = {
202
231
  /**
203
232
  * Represents the payment result for CARD payment request
204
233
  */
205
- type CardPaymentResult = {
206
- /**
207
- * Information about the payment.
208
- */
209
- paymentInfo: PaymentInfo;
234
+ type CardPaymentResult = BasePaymentResult & {
210
235
  /**
211
236
  * Data for slip
212
237
  */
@@ -538,7 +563,7 @@ interface CashRegisterSettings {
538
563
  };
539
564
  }
540
565
 
541
- type BaseReceiptRefundInfo = {
566
+ type ReceiptRefundInfo = {
542
567
  /** The payment provider used for this transaction (e.g. "Ibox", "KaspiQr"). */
543
568
  paymentProvider: PaymentProvider;
544
569
  /** The final status of the payment at the time of printing. */
@@ -549,21 +574,6 @@ type BaseReceiptRefundInfo = {
549
574
  */
550
575
  orderRefundResult?: OrderRefundResult;
551
576
  };
552
- type KioskRefundInfo = BaseReceiptRefundInfo & {
553
- refundSource: RefundSource.Kiosk;
554
- };
555
- type RestaurantCashierRefundInfo = BaseReceiptRefundInfo & {
556
- refundSource: RefundSource.RestaurantCashier;
557
- };
558
- type JobRefundInfo = BaseReceiptRefundInfo & {
559
- refundSource: RefundSource.RefundJob;
560
- };
561
- /**
562
- * Refund context passed to the receipt plugin when printing a refund receipt.
563
- * Discriminated union on `refundSource` — add source-specific fields to the
564
- * corresponding branch as needed.
565
- */
566
- type ReceiptRefundInfo = KioskRefundInfo | RestaurantCashierRefundInfo | JobRefundInfo;
567
577
 
568
578
  /**
569
579
  * Obsolete Receipt interface backward compatibility.
@@ -577,7 +587,7 @@ interface HandleRefundRequestClear {
577
587
  refundInfo?: ReceiptRefundInfo;
578
588
  }
579
589
 
580
- type BaseReceiptPaymentInfo = {
590
+ type ReceiptPaymentInfo = {
581
591
  /** The payment provider used for this transaction (e.g. "Ibox", "KaspiQr"). */
582
592
  paymentProvider: PaymentProvider;
583
593
  /** The final status of the payment at the time of printing. */
@@ -588,18 +598,6 @@ type BaseReceiptPaymentInfo = {
588
598
  */
589
599
  orderPaymentResult?: OrderPaymentResult;
590
600
  };
591
- type KioskPaymentInfo = BaseReceiptPaymentInfo & {
592
- paymentSource: PaymentSource.Kiosk;
593
- };
594
- type RestaurantCashierPaymentInfo = BaseReceiptPaymentInfo & {
595
- paymentSource: PaymentSource.RestaurantCashier;
596
- };
597
- /**
598
- * Payment context passed to the receipt plugin when printing a receipt.
599
- * Discriminated union on `paymentSource` — add source-specific fields to the
600
- * corresponding branch as needed.
601
- */
602
- type ReceiptPaymentInfo = KioskPaymentInfo | RestaurantCashierPaymentInfo;
603
601
 
604
602
  /**
605
603
  * Obsolete Receipt interface backward compatibility.
@@ -636,23 +634,6 @@ interface MakeZReportOptions {
636
634
  withoutPaper?: boolean;
637
635
  }
638
636
 
639
- interface IDigitalReceipt {
640
- views: DigitalReceiptView[];
641
- fields?: Fields;
642
- version: 'v1';
643
- }
644
- type DigitalReceiptViewType = 'mobile' | 'email' | 'link' | 'pos';
645
- type DigitalReceiptView = {
646
- type: DigitalReceiptViewType;
647
- data: string;
648
- };
649
- type Fields = {
650
- type: 'FPtr10';
651
- fnNumber: string;
652
- fiscalDocumentSign: string;
653
- fiscalDocumentNumber: string;
654
- };
655
-
656
637
  /** Other types of receipts may appear here */
657
638
  type PrintedReceipt = PrintedFiscalReceipt | PrintedNonFiscalReceipt;
658
639
  interface PrintedFiscalReceipt {
@@ -752,4 +733,4 @@ declare enum DigitalReceiptNotificationPreference {
752
733
  PhoneSms = "PhoneSms"
753
734
  }
754
735
 
755
- export { type AddedIngredient, Business, type CardInfo, type CardPaymentResult, type CardRefundResult, type CashRegister, type CashRegisterSettings, type Cashier, type Country, type CountryIsoCode, type CreateScopeOptions, type Customer, type DepositCashOptions, DigitalReceiptNotificationPreference, type DigitalReceiptView, type DigitalReceiptViewType, type ErrorMessageMetadataWith, type Fields, type HTMLContentData, type HTMLContentType, type HandleRefundRequest, type HandleRefundRequestClear, type HandleSaleRequest, type HandleSaleRequestClear, type ICashRegister, type IDigitalReceipt, type ILogger, type Image, type InitializationOptions, type JobRefundInfo, type KazakhstanProductData, type KioskPaymentInfo, type KioskRefundInfo, KnownCountryCodes, type KyrgyzstanProductData, type Loyalty, type MakeZReportOptions, type MarkingCodes, type Message, type MessageMetadata, type MessageMetadataWith, type MessageWith, type Money, type OperationIdentifiers, type Order, type OrderPaymentResult, type OrderPrice, type OrderRefundResult, OrderSource, OrderType, type Organization, OwnerType, type PaymentInfo, PaymentMode, type PaymentProvider, type PaymentResult, PaymentSource, PaymentStatus, PaymentType, type PreviousReceipt, type PrintParams, type PrintTextOptions, type PrintedFiscalReceipt, type PrintedNonFiscalReceipt, type PrintedReceipt, type PrintedRefundReceipt, type Product, type ProductPrice, type ProductSpecificData, type QRData, type QRIdData, type QRIdType, type QrPaymentResult, type QrRefundResult, type Receipt, type ReceiptPaymentInfo, type ReceiptRefundInfo, type RefundInfo, type RefundResult, RefundSource, type RestaurantCashierPaymentInfo, type RestaurantCashierRefundInfo, type SlipData, type SlipType, type Store, type Tax, type Taxpayer, type TextSlipData, type TextSlipType, type UzbekistanProductData, type WithdrawCashOptions };
736
+ export { type AddedIngredient, Business, type CardInfo, type CardPaymentResult, type CardRefundResult, type CashRegister, type CashRegisterSettings, type Cashier, type Country, type CountryIsoCode, type CreateScopeOptions, type Customer, type DepositCashOptions, DigitalReceiptNotificationPreference, type DigitalReceiptView, type DigitalReceiptViewType, type ErrorMessageMetadataWith, type Fields, type FiscalizationPayload, type HTMLContentData, type HTMLContentType, type HandleRefundRequest, type HandleRefundRequestClear, type HandleSaleRequest, type HandleSaleRequestClear, type ICashRegister, type IDigitalReceipt, type ILogger, type Image, type InitializationOptions, type KazakhstanProductData, KnownCountryCodes, type KyrgyzstanProductData, type Loyalty, type MakeZReportOptions, type MarkingCodes, type Message, type MessageMetadata, type MessageMetadataWith, type MessageWith, type Money, type OperationIdentifiers, type Order, type OrderPaymentResult, type OrderPrice, type OrderRefundResult, OrderSource, OrderType, type Organization, OwnerType, type PaymentInfo, PaymentMode, type PaymentProvider, type PaymentResult, PaymentSource, PaymentStatus, PaymentType, type PreviousReceipt, type PrintParams, type PrintTextOptions, type PrintedFiscalReceipt, type PrintedNonFiscalReceipt, type PrintedReceipt, type PrintedRefundReceipt, type Product, type ProductPrice, type ProductSpecificData, type QRData, type QRIdData, type QRIdType, type QrPaymentResult, type QrRefundResult, type Receipt, type ReceiptPaymentInfo, type ReceiptRefundInfo, type RefundInfo, type RefundResult, RefundSource, type SlipData, type SlipType, type Store, type Tax, type Taxpayer, type TextSlipData, type TextSlipType, type UzbekistanProductData, type WithdrawCashOptions };
package/dist/index.d.ts CHANGED
@@ -106,6 +106,29 @@ interface ILogger<TScope extends Record<string, unknown> = never> {
106
106
  fatal<T>(message: string, error?: unknown, metadata?: ErrorMessageMetadataWith<T>): void;
107
107
  }
108
108
 
109
+ interface IDigitalReceipt {
110
+ views: DigitalReceiptView[];
111
+ fields?: Fields;
112
+ version: 'v1';
113
+ }
114
+ type DigitalReceiptViewType = 'mobile' | 'email' | 'link' | 'pos';
115
+ type DigitalReceiptView = {
116
+ type: DigitalReceiptViewType;
117
+ data: string;
118
+ };
119
+ type Fields = {
120
+ type: 'FPtr10';
121
+ fnNumber: string;
122
+ fiscalDocumentSign: string;
123
+ fiscalDocumentNumber: string;
124
+ };
125
+
126
+ type FiscalizationPayload = {
127
+ ReceiptId: string;
128
+ Payload: string;
129
+ DigitalReceipt: IDigitalReceipt;
130
+ };
131
+
109
132
  /**
110
133
  * Unique identifier of the transaction
111
134
  */
@@ -189,11 +212,17 @@ type TextSlipData = {
189
212
  */
190
213
  type SlipData = TextSlipData;
191
214
 
192
- type QrPaymentResult = {
215
+ type BasePaymentResult = {
193
216
  /**
194
217
  * Information about the payment.
195
218
  */
196
219
  paymentInfo: PaymentInfo;
220
+ /**
221
+ * Fiscalization payload returned by 2-in-1 devices.
222
+ */
223
+ fiscalizationPayload?: FiscalizationPayload;
224
+ };
225
+ type QrPaymentResult = BasePaymentResult & {
197
226
  /**
198
227
  * QR code data
199
228
  */
@@ -202,11 +231,7 @@ type QrPaymentResult = {
202
231
  /**
203
232
  * Represents the payment result for CARD payment request
204
233
  */
205
- type CardPaymentResult = {
206
- /**
207
- * Information about the payment.
208
- */
209
- paymentInfo: PaymentInfo;
234
+ type CardPaymentResult = BasePaymentResult & {
210
235
  /**
211
236
  * Data for slip
212
237
  */
@@ -538,7 +563,7 @@ interface CashRegisterSettings {
538
563
  };
539
564
  }
540
565
 
541
- type BaseReceiptRefundInfo = {
566
+ type ReceiptRefundInfo = {
542
567
  /** The payment provider used for this transaction (e.g. "Ibox", "KaspiQr"). */
543
568
  paymentProvider: PaymentProvider;
544
569
  /** The final status of the payment at the time of printing. */
@@ -549,21 +574,6 @@ type BaseReceiptRefundInfo = {
549
574
  */
550
575
  orderRefundResult?: OrderRefundResult;
551
576
  };
552
- type KioskRefundInfo = BaseReceiptRefundInfo & {
553
- refundSource: RefundSource.Kiosk;
554
- };
555
- type RestaurantCashierRefundInfo = BaseReceiptRefundInfo & {
556
- refundSource: RefundSource.RestaurantCashier;
557
- };
558
- type JobRefundInfo = BaseReceiptRefundInfo & {
559
- refundSource: RefundSource.RefundJob;
560
- };
561
- /**
562
- * Refund context passed to the receipt plugin when printing a refund receipt.
563
- * Discriminated union on `refundSource` — add source-specific fields to the
564
- * corresponding branch as needed.
565
- */
566
- type ReceiptRefundInfo = KioskRefundInfo | RestaurantCashierRefundInfo | JobRefundInfo;
567
577
 
568
578
  /**
569
579
  * Obsolete Receipt interface backward compatibility.
@@ -577,7 +587,7 @@ interface HandleRefundRequestClear {
577
587
  refundInfo?: ReceiptRefundInfo;
578
588
  }
579
589
 
580
- type BaseReceiptPaymentInfo = {
590
+ type ReceiptPaymentInfo = {
581
591
  /** The payment provider used for this transaction (e.g. "Ibox", "KaspiQr"). */
582
592
  paymentProvider: PaymentProvider;
583
593
  /** The final status of the payment at the time of printing. */
@@ -588,18 +598,6 @@ type BaseReceiptPaymentInfo = {
588
598
  */
589
599
  orderPaymentResult?: OrderPaymentResult;
590
600
  };
591
- type KioskPaymentInfo = BaseReceiptPaymentInfo & {
592
- paymentSource: PaymentSource.Kiosk;
593
- };
594
- type RestaurantCashierPaymentInfo = BaseReceiptPaymentInfo & {
595
- paymentSource: PaymentSource.RestaurantCashier;
596
- };
597
- /**
598
- * Payment context passed to the receipt plugin when printing a receipt.
599
- * Discriminated union on `paymentSource` — add source-specific fields to the
600
- * corresponding branch as needed.
601
- */
602
- type ReceiptPaymentInfo = KioskPaymentInfo | RestaurantCashierPaymentInfo;
603
601
 
604
602
  /**
605
603
  * Obsolete Receipt interface backward compatibility.
@@ -636,23 +634,6 @@ interface MakeZReportOptions {
636
634
  withoutPaper?: boolean;
637
635
  }
638
636
 
639
- interface IDigitalReceipt {
640
- views: DigitalReceiptView[];
641
- fields?: Fields;
642
- version: 'v1';
643
- }
644
- type DigitalReceiptViewType = 'mobile' | 'email' | 'link' | 'pos';
645
- type DigitalReceiptView = {
646
- type: DigitalReceiptViewType;
647
- data: string;
648
- };
649
- type Fields = {
650
- type: 'FPtr10';
651
- fnNumber: string;
652
- fiscalDocumentSign: string;
653
- fiscalDocumentNumber: string;
654
- };
655
-
656
637
  /** Other types of receipts may appear here */
657
638
  type PrintedReceipt = PrintedFiscalReceipt | PrintedNonFiscalReceipt;
658
639
  interface PrintedFiscalReceipt {
@@ -752,4 +733,4 @@ declare enum DigitalReceiptNotificationPreference {
752
733
  PhoneSms = "PhoneSms"
753
734
  }
754
735
 
755
- export { type AddedIngredient, Business, type CardInfo, type CardPaymentResult, type CardRefundResult, type CashRegister, type CashRegisterSettings, type Cashier, type Country, type CountryIsoCode, type CreateScopeOptions, type Customer, type DepositCashOptions, DigitalReceiptNotificationPreference, type DigitalReceiptView, type DigitalReceiptViewType, type ErrorMessageMetadataWith, type Fields, type HTMLContentData, type HTMLContentType, type HandleRefundRequest, type HandleRefundRequestClear, type HandleSaleRequest, type HandleSaleRequestClear, type ICashRegister, type IDigitalReceipt, type ILogger, type Image, type InitializationOptions, type JobRefundInfo, type KazakhstanProductData, type KioskPaymentInfo, type KioskRefundInfo, KnownCountryCodes, type KyrgyzstanProductData, type Loyalty, type MakeZReportOptions, type MarkingCodes, type Message, type MessageMetadata, type MessageMetadataWith, type MessageWith, type Money, type OperationIdentifiers, type Order, type OrderPaymentResult, type OrderPrice, type OrderRefundResult, OrderSource, OrderType, type Organization, OwnerType, type PaymentInfo, PaymentMode, type PaymentProvider, type PaymentResult, PaymentSource, PaymentStatus, PaymentType, type PreviousReceipt, type PrintParams, type PrintTextOptions, type PrintedFiscalReceipt, type PrintedNonFiscalReceipt, type PrintedReceipt, type PrintedRefundReceipt, type Product, type ProductPrice, type ProductSpecificData, type QRData, type QRIdData, type QRIdType, type QrPaymentResult, type QrRefundResult, type Receipt, type ReceiptPaymentInfo, type ReceiptRefundInfo, type RefundInfo, type RefundResult, RefundSource, type RestaurantCashierPaymentInfo, type RestaurantCashierRefundInfo, type SlipData, type SlipType, type Store, type Tax, type Taxpayer, type TextSlipData, type TextSlipType, type UzbekistanProductData, type WithdrawCashOptions };
736
+ export { type AddedIngredient, Business, type CardInfo, type CardPaymentResult, type CardRefundResult, type CashRegister, type CashRegisterSettings, type Cashier, type Country, type CountryIsoCode, type CreateScopeOptions, type Customer, type DepositCashOptions, DigitalReceiptNotificationPreference, type DigitalReceiptView, type DigitalReceiptViewType, type ErrorMessageMetadataWith, type Fields, type FiscalizationPayload, type HTMLContentData, type HTMLContentType, type HandleRefundRequest, type HandleRefundRequestClear, type HandleSaleRequest, type HandleSaleRequestClear, type ICashRegister, type IDigitalReceipt, type ILogger, type Image, type InitializationOptions, type KazakhstanProductData, KnownCountryCodes, type KyrgyzstanProductData, type Loyalty, type MakeZReportOptions, type MarkingCodes, type Message, type MessageMetadata, type MessageMetadataWith, type MessageWith, type Money, type OperationIdentifiers, type Order, type OrderPaymentResult, type OrderPrice, type OrderRefundResult, OrderSource, OrderType, type Organization, OwnerType, type PaymentInfo, PaymentMode, type PaymentProvider, type PaymentResult, PaymentSource, PaymentStatus, PaymentType, type PreviousReceipt, type PrintParams, type PrintTextOptions, type PrintedFiscalReceipt, type PrintedNonFiscalReceipt, type PrintedReceipt, type PrintedRefundReceipt, type Product, type ProductPrice, type ProductSpecificData, type QRData, type QRIdData, type QRIdType, type QrPaymentResult, type QrRefundResult, type Receipt, type ReceiptPaymentInfo, type ReceiptRefundInfo, type RefundInfo, type RefundResult, RefundSource, type SlipData, type SlipType, type Store, type Tax, type Taxpayer, type TextSlipData, type TextSlipType, type UzbekistanProductData, type WithdrawCashOptions };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dodobrands/pos-receipts-plugin-contracts",
3
- "version": "5.13.2",
3
+ "version": "5.13.4",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
package/readme.md DELETED
@@ -1,18 +0,0 @@
1
- # pos-receipts-plugin-contracts
2
-
3
- Public contracts for cash register plugins
4
-
5
- ## Documentation
6
-
7
- Please use auto-generated documentation available [here](https://dodopizza.github.io/cashierapp/)
8
-
9
- ## Creating plugins
10
- Start from the documentation related to [ICashRegister interface](\src\ICashRegister.ts)
11
-
12
-
13
- ## Tech radar
14
-
15
- We at Dodo have expertize at the following [Tech Radar](https://radar.thoughtworks.com/?sheetId=https%3A%2F%2Fdocs.google.com%2Fspreadsheets%2Fd%2F15B0mJaxj8gdS4opGCsn42w3PeIAV0YCfVeEFzzcFe5w%2Fpub%2Foutput%3Dcsv%26format%3D%252FDec%2C%202022)
16
- and try to follow [Dodo NFRs](https://www.notion.so/dodobrands/Frontend-NFR-draft-535df248e84347d1b46147b8026a5250).
17
-
18
- We present it here as a recommendation for all new contributors so that we can provide better support in the future.